package chan.project.smartlawgateway.config;

import chan.project.smartlawmodel.enums.UserRoleEnum;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * [Sa-Token 权限认证] 配置类
 * @author click33
 */
@Configuration
public class SaTokenConfigure {
    // 注册 Sa-Token全局过滤器
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
            // 拦截地址
            .addInclude("/**")    /* 拦截全部path */
            // 开放地址
            .addExclude("/favicon.ico")
            .addExclude("/user/login/**","/user/register/**")  // 确保这些登录接口被排除
            // 鉴权方法：每次访问进入
            .setAuth(obj -> {
                //超级管理员可以调用所有接口，直接放行
                if(StpUtil.hasRole(UserRoleEnum.SUPER_ADMIN.getValue())){
                    return;
                }
                // 权限认证 -- 不同模块, 校验不同权限
                SaRouter.match("/api/common/**", r -> StpUtil.checkRole(UserRoleEnum.USER.getValue()));
                SaRouter.match("/api/lawyer/**", r -> StpUtil.checkRole(UserRoleEnum.LAWYER.getValue()));
                SaRouter.match("/api/data/**", r -> StpUtil.checkRole(UserRoleEnum.DATA_ADMIN.getValue()));
                // 特殊方法校验，有一些接口需要某个特定用户才能进行访问，例如添加数据管理员接口
                //增加删除法律接口，仅超级管理员可用
                SaRouter.match("/api/data/addLaw", r -> StpUtil.checkRole(UserRoleEnum.SUPER_ADMIN.getValue()));
                SaRouter.match("/api/data/deleteLaw", r -> StpUtil.checkRole(UserRoleEnum.SUPER_ADMIN.getValue()));
            })
            // 异常处理方法：每次setAuth函数出现异常时进入
            .setError(e -> SaResult.error(e.getMessage()));
    }
    // Sa-Token 整合 jwt (Simple 简单模式)
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }
}
